package com.mframe.persist;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.mframe.query.PageData;
import com.mframe.query.SqlBuilder;
import com.mframe.system.LoginInfo;

public interface PublicBS {
	
	/**
	 * 获取当前时间
	 * @return
	 */
	public Date getCurrentTime();
	/**
	 * 获取当前的登录对象
	 * @return
	 */
	public LoginInfo getLoginInfo();
	
	/**
	 * 持久化数据,保存
	 * 
	 * @param <T>
	 * @param entity
	 */
	public <T> void saveObject(T entity);

	/**
	 * 持久化数据,修改
	 * 
	 * @param <T>
	 * @param entity
	 */
	public <T> void updateObject(T entity);

	/**
	 * 修改数据 remark:把get出来的对象设置一个要更改的值 然后update(这个对象)
	 * 
	 * @param <T>
	 * @param entity
	 */
	public <T> void delete(T entity);

	/**
	 * 根据ID删数据
	 * 
	 * @param <T>
	 * @param id
	 * @param clazz
	 */
	public <T> void deleteById(Serializable id, Class<T> clazz);

	/**
	 * 执行修改的HQL语句
	 * 
	 * @param hql
	 * @param args
	 *            传入多个参数(从0开始)
	 * @return
	 */
	public int executeHql(final String hql, final Object[] args);

	/**********************/
	/******* 查询操作 *******/
	/**
	 * 使用load方式获取对象 remark:根据数据库的数据，转换成一个对象。当使用对象的时候才会查询、返回的是代理对象
	 * 
	 * @param <T>
	 * @param clazz
	 * @param id
	 * @return
	 */
	@Deprecated
	public <T> T loadById(Class<T> clazz, Serializable id);

	/**
	 * 使用get方式获取对象
	 * 
	 * @param <T>
	 * @param clazz
	 * @param id
	 * @return
	 */
	@Deprecated
	public <T> T getById(Class<T> clazz, Serializable id);
	
	/**
	 * 获取对象
	 * 
	 * @param <T>
	 * @param clazz
	 * @param id
	 * @return
	 */
	public <T> T findById(Class<T> clazz, Serializable id);
	/**
	 * 根据HQL来查询对象
	 * 
	 * @param <T>
	 * @param hql
	 * @param args
	 *            数组方式传入(从0开始)
	 * @return
	 */
	public <T> List<T> findByHql(String hql, Object[] args);

	/**
	 * @param <T>
	 * @param hql
	 * @param args
	 *            Map键值对的方式传入 适用 : select obj where obj.a=:a 这种 key(a,使用另外的字串代表)
	 *            value(实际的值)
	 * @return
	 */
	public <T> List<T> findByHql(String hql, Map<String, Object> args);
	
	/**
	 * @param <T>
	 * @param clazz
	 * @param args
	 *            Map键值对的方式传入 适用
	 *            value(实际的值)
	 * @return
	 */
	public <T> List<T> findByMap(Class<T> clazz, Map<String,Object> params);
	/**
	 * @param hql
	 *            查询的HQL语句
	 * @param pmap
	 *            条件
	 * @param topage
	 *            当前页数
	 * @param pagesize
	 *            当前显示多少个数据
	 * @return
	 */
	public PageData findForPage(final String hql, Map<String, Object> pmap,
			int topage, int pagesize);

	/**
	 * 计算满足条件的记录数
	 * 
	 * @param hql
	 *            HQL语句(使用from obj的HQL 不使用count(*))
	 * @param args
	 *            参数(从0开始)
	 * @return
	 */
	public int findRecordCount(String hql, Object[] args);

	/**
	 * 该条件下是否存在数据
	 * 
	 * @param hql
	 *            HQL语句
	 * @param args
	 *            (从0开始)
	 * @return
	 */
	public boolean findExists(String hql, Object[] args);

	/******** 跟数据库有关 *********/
	/******* 存储过程 *******/

	/**
	 * 调用存储过程返回游标数据
	 * 
	 * @param storeName
	 *            存储过程
	 * @param paramValues
	 *            入参,参数顺序排好
	 * @return
	 */
	public List<Map<String, Object>> callForList(final String storeName,
			Object[] paramValues);

	/**
	 * 调用存储过程返回单指
	 * 
	 * @param storeName
	 *            存储过程
	 * @param paramValues
	 * @param sqlType
	 *            返回的out类型如:java.sql.Types.Varchar; 注意如果是数字类型，返回都是BigDecimal类型
	 * @return
	 */
	public Object callForObj(final String storeName, Object[] paramValues,
			int sqlType);

	/**
	 * 无返回值的存储过程
	 * 
	 * @param storeName
	 * @param paramValues
	 */
	public void callForObj(final String storeName, Object[] paramValues);

	/**
	 * 获取下个sequence的值
	 * 
	 * @param seqName
	 * @return
	 */
	public Long getNextSequence(String seqName);

	/**
	 * function:JDBC执行sql语句 remark:直接使用JDBC
	 * 
	 * @param sql
	 *            sql语句
	 */
	public void executeSql(String sql);

	/**
	 * function:取得MAP remark:直接使用JDBC
	 * 
	 * @param sql
	 *            sql语句
	 * @param args
	 *            参数列表
	 */
	public Map<String, Object> queryForMap(String sql, Object[] args);

	/**
	 * function:取得List remark:直接使用JDBC
	 * 
	 * @param sql
	 *            sql语句
	 * @param args
	 *            参数列表
	 */
	public <T> List<T> queryForBeanList(Class<T> clazz, String sql,
			Object[] args);

	/**
	 * 查询单个类对象
	 * 
	 * @param <T>
	 * @param returnClazz
	 *            查询的类
	 * @param sql
	 *            查询语句
	 * @param paramsValues
	 *            查询参数
	 * @return
	 */
	public <T> T queryForBean(Class<T> returnClazz, String sql,
			Object[] paramsValues);

	/**
	 * jdbcTemplate 查询分页
	 * 
	 * @param <T>
	 *            查询的类
	 * @param sql
	 *            查询的sql语句
	 * @param clazz
	 *            查询类的class（默认的rowMapper）
	 * @param topage
	 *            查询的页号
	 * @param pagesize
	 *            页大小
	 * @param paramsValues
	 *            查询参数，常用？ 占位符形式
	 * @return
	 */
	public <T> PageData queryForPageData(String sql, Class<T> clazz,
			final int topage, final int pagesize, Object[] paramsValues);

	public Object queryForObject(String sql, Object[] paramsValues);

	public Integer queryForInt(String sql, Object[] paramsValues);

	public Long queryForLong(String sql, Object[] paramsValues);

	public <T> List<T> queryForList(String sql, Object[] args,
			Class<T> elementType);

	/**
	 * 根据SqlBuilder对象查询
	 * 
	 * @param builder
	 * @return PageData/List 如果SqlBuilder的listType是Page则返回PageData，否则返回List对象
	 */
	public Object queryBySqlBuilder(SqlBuilder builder);

	public Object queryUnique(SqlBuilder builder);
}
